#ifndef __CMODULE_HPP__
#define __CMODULE_HPP__
#include <memory>
#include <mutex>
#include <queue>
#include <list>
#include <msg.hpp>
#include <condition_variable>
#include <thread>
using namespace std;

enum{
    EMODULE_MODULE_NULL=0,
    EMODULE_MODULE_BASE=0x00000000,
    EMODULE_MODULE_HTTPAPI=0x00000005,
    EMODULE_MODULE_DEVFIND=0x00000006,
    EMODULE_MODULE_SYS_BASE=0x00010000,
    EMODULE_MODULE_CHA_BASE=0x00020000,
    EMODULE_MODULE_DATA_BASE=0x00030000,
    EMODULE_MODULE_DATA_STORATE=0x00030001,
    EMODULE_MODULE_DATA_TASK=0x00030002,
    EMODULE_MODULE_IOT_BASE=0x00040000,
    EMODULE_MODULE_TCP_BASE=0x00050000,
    EMODULE_MODULE_DEVICE_BASE=0x00060000,
    EMODULE_MODULE_MBSERVER_BASE=0x00070000,
};



#define moduleid(mask_,id_) (mask_|id_)
#define submoduleid(id_) (id_ & 0xffff)



class CModule{
public:
    CModule();
    virtual ~CModule();
    virtual void  handle_msg(CMsg_Ptr pMsg);
    CMsg_Ptr get_msg();
    void     put_msg(CMsg_Ptr pMsg,bool bFirst=false);
    void     clear_msgs();
    virtual void     start();
    virtual void     stop();
    static   void run(int moduleId);
    void    adjust_priority(int priority_);
public:
    int m_moduleId;
    bool m_run;
    list<CMsg_Ptr> m_msgs;
    mutex           m_msgMutex;
    condition_variable m_msgCond;

    shared_ptr<thread> m_pTid;
};

typedef shared_ptr<CModule> CModule_Ptr;

#endif